//
//  NSString+YCExtension.h
//  YCPublicDemo
//
//  Created by xinhuanwangluo on 2017/5/17.
//  Copyright © 2017年 xinhuanwangluo. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSString (YCExtension)

#pragma mark - 工具相关

/**
 计算当前时间yyyy-MM-dd hh:mm:ss格式

 @return NSString
 */
+ (NSString *)yc_currentYMDHMSString;


/*
    UI相关
 
 */


/**
 根据一段文字的宽度计算文字显示出来的高度

 @param width 宽度
 @param font 字体
 @return 文字高度
 */
- (CGFloat)yc_heightWithWidth:(CGFloat)width
                         font:(CGFloat)font;


/**
 根据一段文字的高度计算文字显示出来的宽度
 
 @param height 高度
 @param font 字体
 @return 文字宽度
 */
- (CGFloat)yc_widthWithHeight:(CGFloat)height
                         font:(CGFloat)font;



/**
 根据一段文字的宽度计算文字显示出来的高度
 
 @param font 字体
 @param lineSpace 行间距
 @param width 文字宽度
 @param label  要计算文字的控件
 @return 文字高度
 */

- (CGFloat)yc_heightFromStringWithFont:(CGFloat)font lineSpace:(CGFloat)lineSpace width:(CGFloat)width label:(UILabel *)label;

/**
  电话号码中间四位****显示

 @param phoneNum 电话号码
 @return 中间四位****电话号码
 */
+ (NSString * )yc_getSecretStringWithPhoneNumer:(NSString *)phoneNum;



/**
 银行卡号中间8位**** ****显示

 @param bankCard 银行卡号
 @return 银行卡号中间8位**** ****
 */
+ (NSString *)yc_getSecretStringWithBankCard:(NSString *)bankCard;


@end

#pragma mark - 富文本相关
@interface NSAttributedString (YCExtension)


/**
 prefixString拼接suffixString返回NS

 @param prefixString
 @param suffixString
 @return return value description
 */
+ (NSAttributedString *)yc_attributeStringWithPrefixString:(NSString *)prefixString
                                           suffixString:(NSString *)suffixString;



/**
 *  直接返回NSAttributedString
 *
 *  @param prefixString 前面的string
 *  @param prefixFont   字体大小
 *  @param prefixColor  字体颜色
 *  @param suffixString 后面拼接的string
 *  @param suffixFont   字体大小
 *  @param suffixColor  字体颜色
 *
 *  @return 直接返回NSAttributedString
 */
+ (NSAttributedString *)yc_attributeStringWithPrefixString:(NSString *)prefixString
                                             prefixFont:(CGFloat)prefixFont
                                            prefixColor:(UInt32)prefixColor
                                           suffixString:(NSString *)suffixString
                                             suffixFont:(CGFloat)suffixFont
                                            suffixColor:(UInt32)suffixColor;



@end

@interface NSString (ycString)

#pragma mark - 加密相关
/**
 *  @author Huangyibiao
 *
 *  生成MD5加密字符串
 *
 *  @return MD5加密后的字符串
 */
- (NSString *)yc_md5;

/**
 *  @author Huangyibiao
 *
 *  生成SHA1/SHA256/SHA512加密字符串
 *
 *  @return SHA1/SHA256/SHA512加密字符串
 */
- (NSString *)yc_SHA1;
- (NSString *)yc_SHA256;
- (NSString *)yc_SHA512;

/**
 *  @author Huangyibiao
 *
 *  对test进行AES算法加密
 *
 *  @param text 待加密的文本
 *  @param password 加密使用的密码，解密时会需要到此密码
 *
 *  @return AES加密后的字符串
 */
+ (NSString *)yc_AESEncrypt:(NSString *)text
                   password:(NSString *)password;

/**
 *  @author Huangyibiao
 *
 *  进行AES算法解密
 *
 *  @param base64EncodedString 待解密的文本
 *  @param password 加密时使用的密码
 *
 *  @return AES解密后的字符串
 */
+ (NSString *)yc_AESDecrypt:(NSString *)base64EncodedString
                   password:(NSString *)password;

/**
 * @author Huangyibiao
 *
 * 把data转成base64字符串
 *
 * @param data 待转换的二进制数据
 * @param length 转换的长度范围
 *
 * @return 转换后的字符串
 */
+ (NSString *)yc_base64StringFromData:(NSData *)data
                               length:(NSUInteger)length;

#pragma mark - Base64
/*!
 *  @author Huangyibiao
 *
 *  将字符串转换成二进制数据后，再进行base64编码
 *
 *  @return 返回base64编码后的字符串
 */
- (NSString *)yc_base64Encoding;
+ (NSString *)yc_base64Encoding:(NSString *)text;

/*!
 *  @author Huangyibiao
 *
 *  将base64编码字符串还原成普通字符串
 *
 *  @return 普通字符串
 */
+ (NSString *)yc_textWithBase64Encoding:(NSString *)base64Encoding;

/*!
 *  @author Huangyibiao
 *
 *  转换成data数据
 *
 *  @return data数据
 */
- (NSData *)yc_toData;
+ (NSString *)yc_toString:(NSData *)data;

#pragma mark - 验证相关
/**
 *  @author Huangyibiao
 *
 *  判断是否是合格的邮箱格式
 *
 *  @return YES表示正确，NO表示不正确
 */
- (BOOL)yc_isValidEmail;
+ (BOOL)yc_isValidEmail:(NSString *)email;

/*!
 * @author Huangyibiao
 *
 * 验证是否是正确的手机号码格式
 *
 * @return YES表示是正确的手机号码格式，返回NO表示手机号码格式不正确
 */
- (BOOL)yc_isValidPhone;
+ (BOOL)yc_isValidPhone:(NSString *)phone;

/*!
 * @author Huangyibiao
 *
 * 验证是否是正确的固定电话号码格式
 *
 * @return YES表示是正确的固定电话号码格式，返回NO表示固话号码格式不正确
 */
- (BOOL)yc_isValidTelNumber;
+ (BOOL)yc_isValidTelNumber:(NSString *)telNumber;

/*!
 * @author Huangyibiao
 *
 * 验证是否是正确的18位身份证号码格式
 *
 * @return YES表示是正确的身份证号码格式，返回NO表示身份证号码格式不正确
 */
- (BOOL)yc_isValidPersonID;
+ (BOOL)yc_isValidPersonID:(NSString *)PID;



/**
 验证是否是

 @param bankCardNumber 银行卡号
 @return Yes是正确的身份证号码，No表示身份证号码格式不正确
 */
+ (BOOL)yc_isValidBankCardNumber:(NSString *)bankCardNumber;


#pragma mark - 去空格
/*!
 *  @author Huangyibiao
 *
 * 去掉空格符号操作，分别是去掉左边的空格、去掉右边的空格、去掉两边的空格、去掉所有空格、去掉所有字母、
 * 去掉字符中中所有的指定的字符
 *
 * @return 处理后的字符串
 */
- (NSString *)yc_trimLeft;
- (NSString *)yc_trimRight;
- (NSString *)yc_trim;
- (NSString *)yc_trimAll;
- (NSString *)yc_trimLetters;
- (NSString *)yc_trimCharacter:(unichar)character;
- (NSString *)yc_trimWhitespace;

/**
 *  @author Huangyibiao
 *
 *  获取字符串中共有多少行
 *
 *  @return 行数
 */
- (NSUInteger)yc_numberOfLines;

#pragma mark - 判断字母、数字
/*!
 * @author Huangyibiao
 *
 * 判断是否只包含字母、数字、字母和数字
 *
 * @return YES，表示条件正确，否则返回NO
 */
- (BOOL)yc_isOnlyLetters;
- (BOOL)yc_isOnlyNumbers;
- (BOOL)yc_isOnlyAlphaNumeric;
/**
 *  是否是数字和字母
 **/
+ (BOOL)yc_isNumOrLetter:(NSString *)string;

/*!
 * @author Huangyibiao
 *
 * 判断是否是空串/判断去掉两边的空格后是否是空串
 *
 * @return YES表示是空串，NO表示非空
 */
- (BOOL)yc_isEmpty;
- (BOOL)yc_isTrimEmpty;

#pragma mark - URL包装
/**
 * @author Huangyibiao
 *
 * 转换成URL
 *
 * @note 前提条件是满URL
 */
- (NSURL *)yc_toURL;

/**
 * @author Huangyibiao
 *
 * 把URL进行UTF8转码
 *
 * @note 前提条件是满足URL
 */
- (NSString *)yc_URLEncode;

#pragma mark - 过滤HTML标签
/*!
 * @author Huangyibiao
 *
 * 过滤掉HTML标签
 *
 * @param html HTML内容
 * @param 返回喜欢去掉所有HTML标签后的字符串
 */
- (NSString *)yc_filteredHtml;
+ (NSString *)yc_filterHTML:(NSString *)html;

#pragma mark - 添加前缀、后缀
/*!
 * @author Huangyibiao
 *
 * 添加前缀、后缀（不修改self）
 *
 * @param prefix-前缀 subfix-后缀
 * @param 返回添加后的字符串
 */
- (NSString *)yc_addPrefix:(NSString *)prefix;
- (NSString *)yc_addSubfix:(NSString *)subfix;

#pragma mark - 获取文件路径
/*!
 * @author Huangyibiao
 *
 * 根据文件名返回文件的路径
 * @param  fileName 文件名(使用type参数，就不能加后缀)
 * @param  type     文件后缀名
 *
 * @return 如果文件路径存在，则返回该文件路径，否则返回nil
 */
+ (NSString *)yc_pathWithFileName:(NSString *)fileName;
+ (NSString *)yc_pathWithFileName:(NSString *)fileName
                           ofType:(NSString *)type;

#pragma mark - 获取Documents/tmp/Cache路径
/*!
 * @author Huangyibiao
 *
 * 获取Documents/tmp/Cache路径
 */
+ (NSString *)yc_documentPath;
+ (NSString *)yc_tmpPath;
+ (NSString *)yc_cachePath;
/*!
 * @author guoyouzeng
 *
 * 判断是否包含字符串
 * @param  str     需要判断的被包含的字符串
 */
-(BOOL)yc_isContainString:(NSString *)str;

//获取IP地址
+ (NSString *)getIPAddress:(BOOL)preferIPv4;

+ (NSString *)lr_stringDate;


// 判断身份证号是否有效
+ (BOOL) yc_validateIdentityCard: (NSString *)identityCard;

//根据身份号获取性别
+ (NSString *)yc_validateIdentifierCardSex:(NSString *)identifierCard;

//根据身份号获取年龄

+ (NSString *)yc_validateIdentifierCardAge:(NSString *)identifierCard;

//根据身份号获取生日期
+(NSString *)yc_birthdayStrFromIdentityCard:(NSString *)numberStr;

//根据身份号日期是否有效
+ (NSString *)yc_validateIdentifierCardWithDate:(NSString *)date;

//不能输入数字
+ (BOOL)yc_inputShouldNumber:(NSString *)inputString;

@end



